共计 1791 个字符,预计需要花费 5 分钟才能阅读完成。
引入
Pickle 是 Python 特有的序列化模块, 它只能用于 Python, 并且可能不同版本的 Python 彼此都不兼容,但是 pickle 的好处是可以存储 Python 中的 所有的数据类型,包括对象,而 json 不行
ps : 一般用 Pickle 保存那些不重要的数据,不能成功地反序列化也没关系
一. 序列化与反序列化介绍
Pickle 是 Python 的内置模块👈点我给你介绍
二.Pickle 的使用
1. 简单使用
- pickle 将数据存成 Bytes 类型
import pickle
s = {1,2,3,4}
print(pickle.dumps(s))
# b'\x80\x03cbuiltins\nset\nq\x00]q\x01(K\x01K\x02K\x03K\x04e\x85q\x02Rq\x03.'
b = b'\x80\x03cbuiltins\nset\nq\x00]q\x01(K\x01K\x02K\x03K\x04e\x85q\x02Rq\x03.'
print(pickle.loads(b))
# {1, 2, 3, 4}
2. 写入文件序列化与反序列化
- 序列化 :
.dumps()
import pickle
s = {1, 2, 3, 4, 5,}
res = pickle.dumps(s)
with open('db.pkl', 'wb',)as f:
f.write(res)
- 反序列化 :
loads()
with open('db.pkl', 'rb')as f:
data = f.read()
dic = pickle.loads(data)
print(res,type(res)) # {1, 2, 3, 4, 5} <class 'set'>
3. 简单序列化与反序列化 (提供直接写入文件功能)
- 序列化 :
dump()
import pickle
s=[1,2,3,4,5]
with open('db.pic','wb')as f:
pickle.dump(s,f)
- 反序列化 :
load()
with open('db.pic','rb')as f:
res = pickle.load(f)
print(res,type(res)) # [1, 2, 3, 4, 5] <class 'list'>
三.Pickle 与 json 对比
1.json 格式
- 通用格式, 任何语言都支持, 并且都可以解析
- 数据类型有限 : 字典, 列表, 布尔
2.pickle 格式
- 只适用于 Python, 序列化之后拿到的返回值是 Bytes 类型, 其他语言识别不了
- 但可以支持 Python 中的 任意类型
3. 两种格式序列化与反序列化对比
import json
import pickle
dic = {'name' : 'shawn'}
⛅序列化
jjj = json.dumps(dic)
ppp = pickle.dumps(dic)
print(jjj) # {"name": "shawn"}
print(ppp) # b'\x80\x03}q\x00X\x04\x00\x00\x00nameq\x01X\x05\x00\x00\x00shawnq\x02s.'
print(type(jjj)) # <class 'str'>
print(type(ppp) # <class 'bytes'>
⛅反序列化
jjj2 = json.loads('{"name": "shawn"}')
ppp2 = pickle.loads(b'\x80\x03}q\x00X\x04\x00\x00\x00nameq\x01X\x05\x00\x00\x00shawnq\x02s.')
print(jjj2) # {'name': 'shawn'}
print(ppp2) # {'name': 'shawn'}
print(jjj2["name"],type(jjj2)) # shawn <class 'dict'>
print(ppp2["name"],type(ppp2)) # shawn <class 'dict'>
4.pickle 可序列化任意类型小示例
import json
import pickle
dic = {'type' : input}
res1 = json.dumps(dic) # 报错 : TypeError
res2 = p c)
print(res2) # b'\x80\x03}q\x00X\x04\x00\x00\x00typeq\x01cbuiltins\ninput\nq\x02s.'
pickle.loads(res2)["type"]() # 反序列化加括号 "()" 出来可以直接使用 "input" 函数
正文完